﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "ElementId.h"

namespace gcmp
{
    class IDocument;
    class IModelView;
    class IElementLocator;

    /// \brief 罗盘工具。该罗盘工具提供了用户常用的操作罗盘的方法。
    class GCMP_MODEL_INTERFACE_EXPORT ElementLocatorUtils
    {
    public:
        /// \brief 根据选择集计算罗盘位置，并显示罗盘。
        /// \param pDocument当前文档对象指针。
        /// \param pModelView 当前视图的ModeView对象指针。
        /// \param selectedIds 需要加入罗盘的元素选择集引用。
        static void DisplayElementLocator(IDocument* pDocument, IModelView* pModelView, const std::set<ElementId>& selectedIds);
        
        /// \brief 隐藏罗盘。
        /// \param pDocument当前文档对象指针。
        static void HideElementLocator(IDocument* pDocument);

        /// \brief 获取罗盘对象指针。
        /// \return 成功则返回罗盘对象指针；失败则返回nullptr。
        static IElementLocator* GetElementLocator(const IDocument* pDocument);

        /// \brief 当罗盘的选择集未发生变化时，直接显示罗盘，不依赖选择集重新计算显示。
        /// \param pElementLocator 罗盘对象指针。
        static void DisplayElementLocatorHandles(IElementLocator* pElementLocatorz);

        /// \brief 获取罗盘对象显示状态。
        /// \return 返回罗盘对象显示状态。true表示正常显示，false表示不显示。
        static bool GetElementLocatorDisplayStatus();

        /// \brief 设置罗盘对象显示状态。
        /// \param flag表示罗盘对象显示状态。true表示正常显示，false表示不显示。
        static void SetElementLocatorDisplayStatus(bool flag);

        /// \brief 通过ModelView更新罗盘。
        /// \param pModelView ModelView对象指针。
        /// \param pElementLocator 罗盘对象指针。
        static void UpdateElementLocatorByModelView(const IModelView *pModelView, IElementLocator *pElementLocator);

        //////////////////////////////////////////////////////////////////////////
        // 注意：临时添加用于解决罗盘拖拽Api缺失问题， 请勿使用！请勿使用！
        /// \brief 判断是否是罗盘拖拽轴。
        /// \return 返回true表示是罗盘拖拽轴，false表示不是。
        static bool IsElementLocatorMovementHandler(const IDocument* pDocument, const ElementId& id);
        static bool IsElementLocatorRotationHandler(const IDocument* pDocument, const ElementId& id);
        static bool IsElementLocatorPlanarMoveHandler(const IDocument* pDocument, const ElementId& id);
    };
}



